#ifndef eval_proc_h
#define eval_proc_h

#include "worksheet.h"
#include "custom_string.h"
#include "mesinkata.h"
#include "displayTab.h"
#include <math.h>

#define MaxArg 100

typedef string formula;


	
//-----------------------
//   Operasi Aritmatik
//-----------------------

string PLUS ( string a, string b );
/* menghasilkan a+b jika a dan b adalah integer atau real,
jika tidak mengembalikan string 'error' 
catatan : a/b mungkin minus */

string MIN ( string a, string b );
/* menghasilkan a-b jika a dan b adalah integer atau real, 
jika tidak mengembalikan string 'error' 
catatan : a/b mungkin minus */

string DIVIDE ( string a, string b );
/* menghasilkan a/b jika a dan b adalah integer atau real, 
jika tidak mengembalikan string 'error'
catatan : a/b mungkin minus 
catatan : mungkin ada pembagian dengan 0  */

string MULTI ( string a, string b );
/* menghasilkan a*b jika a dan b adalah integer atau real,
jika tidak mengembalikan string 'error' 
catatan : a/b mungkin minus */

string POW ( string a, string b );
/* menghasilkan a^b jika a dan b adalah integer atau real, 
jika tidak mengembalikan string 'error'
catatan gunakan fungsi pwr di math.h, b mungkin bilangan real 
catatan : a/b mungkin minus */

string DIV ( string a, string b);
/* menghasilkan hasil operasi a div b jika a dan b adalah integer positif
 jika tidak mengembalikan string 'error' 
catatan : mungkin ada pembagian dengan 0  */

string MOD ( string a, string b);
/* menghasilkan hasil operasi a mod b jika a dan b adalah integer positif
 jika tidak mengembalikan string 'error' */
 
string SQR ( string a );
/* menghasilkan kuadrat dari a .jika a adalah integer atau real,
jika tidak mengembalikan string 'error'
catatan : a/b mungkin minus  */

string SQRT ( string a );
/* menghasilkan akar dari a. jika a adalah integer atau real,
jika tidak mengembalikan string 'error' 
catatan : a mungkin minus */

string MINUS ( string a );
/* menghasilkan negatif a. jika a adalah integer atau real,
jika tidak mengembalikan string 'error' 
catatan : a mungkin minus */


//-----------------------
//   Operasi Relasional
//-----------------------

string EQ ( string a, string b );
/* mengecek kesamaan a dan b , a dan b bisa berupa string, integer dan real
catatan : pengecekan untuk real menggunakan epsilon 
catatan : pembandingan string dengan tipe integer dan real tidak dimungkinkan
kembalikan string 'error' */

string NEQ ( string a, string b );
/* mengecek ketidaksamaan a dan b [jika a!= b return 1]
, a dan b bisa berupa string, integer dan real
catatan : pengecekan untuk real menggunakan epsilon 
catatan : pembandingan string dengan tipe integer dan real tidak dimungkinkan
kembalikan string 'error'
catatan : ah pake fungsi diatas aja yak */

string GT ( string a, string b );
/* mengecek apakah a lebih besar dari b, a dan b bisa berupa string, integer dan real 
catatan : pembandingan string dilakukan dengan alfabetis
catatan : pembandingan string dengan tipe integer dan real tidak dimungkinkan
kembalikan string 'error'  */

string LT ( string a, string b );
/* mengecek apakah a lebih kecil dari b, a dan b bisa berupa string, integer dan real 
catatan : pembandingan string dilakukan dengan alfabetis
catatan : pembandingan string dengan tipe integer dan real tidak dimungkinkan
kembalikan string 'error'  */

string GTOEQ ( string a, string b );
/* mengecek apakah a lebih besar samadengan b, a dan b bisa berupa string, integer dan real 
catatan : pembandingan string dilakukan dengan alfabetis
catatan : pembandingan string dengan tipe integer dan real tidak dimungkinkan
kembalikan string 'error'  */

string LTOEQ ( string a, string b );
/* mengecek apakah a lebih kecil samadengan b, a dan b bisa berupa string, integer dan real 
catatan : pembandingan string dilakukan dengan alfabetis
catatan : pembandingan string dengan tipe integer dan real tidak dimungkinkan
kembalikan string 'error'  */

//-----------------------
//   Operasi Boolean
//-----------------------

string AND ( string a, string b);
/* mengembalikan hasil operasi a AND b jika a dan b adalah boolean
,jika tidak kembalikan string 'error' */

string OR ( string a, string b);
/* mengembalikan hasil operasi a OR b jika a dan b adalah boolean
,jika tidak kembalikan string 'error' */

string NOT ( string a );
/* mengembalikan hasil negasi dari a jika a adalah boolean
,jika tidak kembalikan string 'error' */

string IFCOND (string cond, string iftrue, string iffalse);
/* Menghasilkan ifftrue jika cond bernilai true dan iffalse jika cond bernilai false */
/* Menghasilkan error jika cond tidak bernilai boolean */

//-----------------------
//   Operasi String
//-----------------------

string CONCAT ( string a, string b );
/* menghasilkan konkatenasi dari string a dan b 
catatan : tinggal pake fungsi concat yang di custom_string.h */


//-----------------------
//   Operasi terhadap AREA 
//-----------------------
/* Area dinyatakan dalam 2 string, yaitu PosStart dan PosEnd
contoh format Posisi : A12*/

string SUM ( Sheet S, string PosStart , string PosEnd );
/* mengembalikan jumlah semua nilai numerik dari PosStart [pojok kiri atas] sampai 
PosEnd [pojok kanan bawah] 
catatan : jika terdapat nilai non-numerik / error , abaikan
*/

string AVERAGE ( Sheet S, string PosStart , string PosEnd );
/* mengembalikan nilai rata-rata dari semua nilai numerik [real&integer] dari PosStart [pojok kiri atas] sampai 
PosEnd [pojok kanan bawah] 
catatan : jika terdapat nilai non-numerik / error, abaikan
*/

string COUNTNUM ( Sheet S, string PosStart , string PosEnd );
/* mengembalikan banyak elemen (bertipe numerik [real&integer]) dari PosStart [pojok kiri atas] 
sampai PosEnd [pojok kanan bawah]
catatan : jika terdapat nilai non-numerik / error , abaikan
*/

string COUNT ( Sheet S, string PosStart , string PosEnd );
/* mengembalikan banyak elemen (bertipe apa pun kecuali error) dari PosStart [pojok kiri atas] 
sampai PosEnd [pojok kanan bawah]*/

string MAXS ( Sheet S, string PosStart , string PosEnd );
/* mengembalikan nilai maksimum dari semua nilai numerik dari PosStart [pojok kiri atas] sampai 
PosEnd [pojok kanan bawah] 
catatan : jika terdapat nilai non-numerik / error etc, abaikan
*/

string MINI ( Sheet S, string PosStart , string PosEnd );
/* mengembalikan nilai minimum dari semua nilai numerik dari PosStart [pojok kiri atas] sampai 
PosEnd [pojok kanan bawah] 
catatan : jika terdapat nilai non-numerik / error etc, abaikan
*/

string STDEV ( Sheet S, const string PosStart , const string PosEnd );
/* mengembalikan nilai standar deviasi dari semua nilai numerik [real&integer] 
dari PosStart [pojok kiri atas] sampai dengan PosEnd [pojok kanan bawah] 
catatan : jika terdapat nilai non-numerik / error, abaikan
*/
string SqrXY (Sheet S, string Pos);
/* Menghasilkan nilai kuadrat dari nilai sebuah cell di sheet dengan posisi (Col,Row) */

string SqrtXY (Sheet S, string Pos);
/* Menghasilkan akar kuadrat dari nilai sebuah cell di sheet dengan posisi (Col,Row) */

void PosToCR(string Pos, string *Col, int *Row);
/* Mengubah string posisi menjadi dalam bentuk kolom dan baris */

void CRToPos (string Column, int Row, string *Pos);

#endif
